package edu.cque.jt.provider.controller;


import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * @author Hua
 * @create 2022-07-21 18:38
 * 测试是否启用本地缓存的配置(这个配置从配置中心读取)
 */
@RefreshScope
@RestController
public class ProviderCacheController {
    @Value("${useLocalCache:false}")//默认值false
    private boolean useLocalCache;

    @RequestMapping("/provider/cache01")
    public String doUseLocalCache01() {
        return "useLocalCache'value is   " + useLocalCache;
    }

    //构建一个本地缓存对象   CopyOnWriteArrayList是线程安全的集合,允许多个线程并发更新,但是只能有一个更新成功
    private List<String> cache = new CopyOnWriteArrayList<>();
    @RequestMapping("/provider/cache02")
    public List<String> doUseLocalCache02() {

        //通过缓存来代替从数据库查询访问频率很高变化频率低的数据
        if (cache.isEmpty()) {
           synchronized (cache){//所以第一个if判断要不要进入解锁,第二个if再次判断是不是已经有线程解锁执行成功,那么在锁里面等待的线程还要不要执行.
               if (cache.isEmpty()){
                   System.out.println("===get data from database==");
                   List<String> cates = Arrays.asList("category-a", "category-b");
                   cache.addAll(cates);
               }

            }
        }
        return cache;
    }
}
